package simbolos;

import java.util.ArrayList;
import java.util.Iterator;


public class TipoPropiedades {
	private int nivel;
	private int dir;
	private int tam;
	private String tipo;
	private String idRef; // REF -> tTipo del tipo al que referencia
	private ArrayList<Campo> campos = new ArrayList<Campo>(); 
	private int nElems; 
	private String tBase;
	private ArrayList<Params> AParams; 
	private int inicio;
	
	public TipoPropiedades(int nivel, int dir, int tam, String tipo, String idRef, ArrayList<Campo> campos, int nElems, String tBase, ArrayList<Params> AParams, int inicio){
		this.nivel = nivel;
		this.dir = dir;
		this.tam = tam;
		this.ponTipo(tipo);
		this.idRef = idRef;
		this.campos = campos;
		this.nElems = nElems;
		this.tBase = tBase;
		this.AParams = AParams;
		this.inicio = inicio;
	}
	
	public TipoPropiedades(int nivel, int dir, int tam, String tipo, String idRef, ArrayList<Campo> campos, int nElems, String tBase){
		this.nivel = nivel;
		this.dir = dir;
		this.tam = tam;
		this.ponTipo(tipo);
		this.idRef = idRef;
		this.campos = campos;
		this.nElems = nElems;
		this.tBase = tBase;
		this.AParams = null;
		this.inicio = -1;
	}
	
	public TipoPropiedades(String tipo){
		this.nivel = -1;
		this.dir = -1;
		this.tam = 1;
		this.ponTipo(tipo);
		this.idRef = null;
		this.campos = null;
		this.nElems = -1;
		this.tBase = null;
		this.AParams = null;
		this.inicio = -1;
	}
	
	public TipoPropiedades(int inicio){
		this.nivel = -1;
		this.dir = -1;
		this.tam = 1;
		this.tipo = null;
		this.idRef = null;
		this.campos = null;
		this.nElems = -1;
		this.tBase = null;
		this.AParams = null;
		this.inicio = inicio;
	}
	
	
	public int dameNivel() {
		return nivel;
	}

	public void ponNivel(int nivel) {
		this.nivel = nivel;
	}

	public int dameDir() {
		return dir;
	}

	public void ponDir(int dir) {
		this.dir = dir;
	}

	public int dameTam() {
		return tam;
	}

	public void ponTam(int tam) {
		this.tam = tam;
	}

	public String dameTipo() {
		return tipo;
	}
	
	public void ponTipo(String ti) {
		if(ti != null){
			if(ti.equals("entero")) this.tipo = "tEntero";
			else if(ti.equals("natural")) this.tipo = "tNatural";
			else if(ti.equals("real")) this.tipo = "tReal";
			else if(ti.equals("caracter")) this.tipo = "tCaracter";
			else if(ti.equals("booleano")) this.tipo = "tBooleano";
			else if(ti.equals("registro")) this.tipo = "tRegistro";
			else if(ti.equals("vector")) this.tipo = "tVector";
			else if(ti.equals("puntero")) this.tipo = "tPuntero";
			else this.tipo = ti;
		} 
		else this.tipo = ti;
	}

	public String dameIdRef() {
		return idRef;
	}

	public void ponIdRef(String idRef) {
		this.idRef = idRef;
	}

	public ArrayList<Campo> dameCampos() {
		return campos;
	}
	
	public Campo dameCampo(String id){
		Iterator<Campo> it = campos.iterator();
		while(it.hasNext()){
			Campo c = it.next();
			if(c.dameId().equals(id))
				return c;
		}
		return null;
	}

	public void ponCampos(ArrayList<Campo> campos) {
		this.campos = campos;
	}

	public int damenElems() {
		return nElems;
	}

	public void ponnElems(int nElems) {
		this.nElems = nElems;
	}

	public String dametBase() {
		return tBase;
	}

	public void pontBase(String tBase) {
		this.tBase = tBase;
	}
	
	public ArrayList<Params> dameAParams() {
		return AParams;
	}

	public void ponAParams(ArrayList<Params> aParams) {
		AParams = aParams;
	}
	
	public int dameInicio() {
		return inicio;
	}

	public void ponInicio(int inicio) {
		this.inicio = inicio;
	}

	public boolean equals(Object o){
		if (o == null) return false;
		if(o instanceof TipoPropiedades){
			TipoPropiedades tp = (TipoPropiedades) o;
					
			if((this.nivel==tp.nivel) && (this.dir==tp.dir) && (this.tam==tp.tam)
				&& (this.nElems==tp.nElems)){
				boolean uno = false;
				boolean dos = false;
				boolean tres = false;
				boolean cuatro = false;
				
				if((this.tipo == null) && (tp.tipo != null) || (this.tipo != null) && (tp.tipo == null))return false;
				else if ((this.tipo == null) && (tp.tipo == null))uno = true;
				else if (this.tipo.equals(tp.tipo))uno = true;
			
				if((this.idRef == null) && (tp.idRef != null) || (this.idRef != null) && (tp.idRef == null))return false;
				else if ((this.idRef == null) && (tp.idRef == null))dos = true;
				else if (this.idRef.equals(tp.idRef))dos = true;
				
				if((this.campos == null) && (tp.campos != null) || (this.campos != null) && (tp.campos == null))return false;
				else if ((this.campos == null) && (tp.campos == null))tres = true;
				else if (this.campos.equals(tp.campos))tres = true;
				
				if((this.tBase == null) && (tp.tBase != null) || (this.tBase != null) && (tp.tBase == null))return false;
				else if ((this.tBase == null) && (tp.tBase == null))cuatro = true;
				else if (this.tBase.equals(tp.tBase))cuatro = true;
				
				if(uno && dos && tres && cuatro)return true;
			}						
		}
		return false;
	}
}
